package com.wushijia.designpatterns.templetemethod;

/**
 * description:模板方法模式,InputStream中的read方法就是模板方法
 *
 * @author yang
 * @date 2018/1/16 19:48
 */
public abstract class AbstractTempleteMethod {

  final void templeteMethod() {
    //声明为fianl，防止子类修改以下顺序
    primitiveOperation1();
    primitiveOperation2();
    concreteOperation();
    if (hook()){
      System.out.println("顾客想要牛奶！！！");
    }
  }

  /**
   * description:模板方法1
   * @author yang
   * @date 2018/1/16 22:21
   */
  abstract void primitiveOperation1();

  /**
   * description:模板方法2
   * @author yang
   * @date 2018/1/16 22:21
   */
  abstract void primitiveOperation2();

  void concreteOperation() {
    System.out.println("concreteOperation......");
  }

  /**
   * description:钩子，默认不做事的方法，子类视情况而定，要不要覆盖该方法
   *
   * @author yang
   * @date 2018/1/16 19:51
   */
  boolean hook() {
    return true;
  }
}
